home *** CD-ROM | disk | FTP | other *** search
/ Oh!X 2001 Spring / Oh!X 2001 Spring Special CD-ROM (Japan) (Track 1).bin / DX8VC / Cube / Cube.cpp next >
Encoding:
C/C++ Source or Header  |  2001-01-08  |  13.1 KB  |  472 lines

  1. // Direct3D RM サンプルプログラム 
  2. // Cube.cpp
  3.  
  4. #include "stdafx.h"
  5. #include "Cube.h"
  6. #define APPNAME    "Cube"
  7.  
  8. LRESULT CALLBACK WndProc(HWND, UINT, UINT, LONG);
  9. BOOL bActive = FALSE;
  10.  
  11. IDirectDraw *lpDD=NULL;                    // DirectDrawオブジェクト
  12. IDirectDrawSurface *lpDDPrimary=NULL;    // プライマリサーフェス
  13. IDirectDrawSurface *lpDDBack=NULL;        // バックサーフェス
  14.  
  15. IDirect3D2 *lpD3D=NULL;                    // Direct3Dオブジェクト
  16. IDirect3DDevice2 *lpD3DDev=NULL;        // Direct3Dデバイス
  17. IDirectDrawSurface *lpDDZ=NULL;            // Zバッファ
  18.  
  19. IDirect3DRM3 *lpD3DRM=NULL;                // Direct3D RMオブジェクト
  20. IDirect3DRMDevice3 *lpD3DRMDev=NULL;    // Direct3D RMデバイス
  21.  
  22. IDirect3DRMFrame3 *lpD3DRMScene=NULL;    // シーンフレーム
  23. IDirect3DRMFrame3 *lpD3DRMCamera=NULL;    // カメラフレーム
  24. IDirect3DRMViewport2 *lpD3DRMView=NULL;    // ビューポート
  25. IDirect3DRMFrame3 *lpD3DRMLight=NULL;    // ライトフレーム
  26.  
  27. IDirect3DRMFrame3 *lpD3DRMCube=NULL;    // キューブオブジェクト
  28.  
  29. int PASCAL WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
  30.    LPSTR lpCmdLine, int nCmdShow)
  31. {
  32.     WNDCLASS wc;
  33.     HWND hWnd;
  34.     MSG msg;
  35.  
  36.     wc.style=CS_HREDRAW|CS_VREDRAW;
  37.     wc.lpfnWndProc=WndProc;
  38.     wc.cbClsExtra=0;
  39.     wc.cbWndExtra=0;
  40.     wc.hInstance=hInstance;
  41.     wc.hIcon=LoadIcon(hInstance, IDI_APPLICATION);
  42.     wc.hCursor=LoadCursor(NULL, IDC_ARROW);
  43.     wc.hbrBackground=(HBRUSH)GetStockBrush(BLACK_BRUSH);
  44.     wc.lpszMenuName=0;
  45.     wc.lpszClassName=APPNAME;
  46.  
  47.     RegisterClass(&wc);
  48.  
  49.     // ウィンドウクラスの登録
  50.     hWnd=CreateWindowEx(0, APPNAME, APPNAME, WS_POPUP, 0, 0,
  51.         GetSystemMetrics(SM_CXSCREEN), GetSystemMetrics(SM_CYSCREEN),
  52.         NULL, NULL, hInstance, NULL);
  53.  
  54.     if(!hWnd) return FALSE;
  55.  
  56.     ShowWindow(hWnd, nCmdShow);
  57.     UpdateWindow(hWnd);
  58.  
  59.     // DirectDrawの初期化
  60.     if(!InitDDraw(hWnd)) return FALSE;
  61.     // Direct3Dの初期化
  62.     if(!InitD3D(hWnd)) return FALSE;
  63.     // シーンの初期化
  64.     if(!BuildScene(lpD3DRM, lpD3DRMDev, lpD3DRMView, lpD3DRMScene, lpD3DRMCamera)) return FALSE;
  65.  
  66.     // 初期化終了
  67.     bActive=TRUE;
  68.  
  69.     Render();
  70.     BOOL update;
  71.     // メッセージポンプ
  72.     while(TRUE){
  73.         if(PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE)){
  74.             if(!GetMessage(&msg, NULL, 0, 0 )){
  75.                 return msg.wParam;
  76.             }
  77.             TranslateMessage(&msg);
  78.             DispatchMessage(&msg);
  79.         }
  80.         update=FALSE;
  81.         if(bActive){
  82.             if(GetAsyncKeyState(VK_UP)){
  83.                 lpD3DRMCube->AddRotation(D3DRMCOMBINE_AFTER, D3DVAL(1), D3DVAL(0), D3DVAL(0), D3DVAL(0.1));
  84.                 update=TRUE;
  85.             }
  86.             if(GetAsyncKeyState(VK_DOWN)){
  87.                 lpD3DRMCube->AddRotation(D3DRMCOMBINE_AFTER, D3DVAL(1), D3DVAL(0), D3DVAL(0), -D3DVAL(0.1));
  88.                 update=TRUE;
  89.             }
  90.             if(GetAsyncKeyState(VK_LEFT)){
  91.                 lpD3DRMCube->AddRotation(D3DRMCOMBINE_AFTER, D3DVAL(0), D3DVAL(1), D3DVAL(0), D3DVAL(0.1));
  92.                 update=TRUE;
  93.             }
  94.             if(GetAsyncKeyState(VK_RIGHT)){
  95.                 lpD3DRMCube->AddRotation(D3DRMCOMBINE_AFTER, D3DVAL(0), D3DVAL(1), D3DVAL(0), -D3DVAL(0.1));
  96.                 update=TRUE;
  97.             }
  98.             if(update) Render();
  99.         }
  100.     }
  101. }
  102.  
  103. long FAR PASCAL WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
  104. {
  105.     switch(message){
  106.     case WM_ACTIVATEAPP:
  107.         bActive=(BOOL)wParam;
  108.         if(bActive && lpDD){
  109.             ResumeSurfaces();
  110.             Render();
  111.         }
  112.         break;
  113.     case WM_CREATE:
  114.         break;
  115.     case WM_SETCURSOR:
  116.         SetCursor(NULL);
  117.         return TRUE;
  118.     case WM_KEYDOWN:
  119.         switch(wParam){
  120.         case VK_ESCAPE:
  121.             DestroyWindow(hWnd);
  122.             break;
  123.         }
  124.         return TRUE;
  125.     case WM_DESTROY:
  126.         bActive=FALSE;
  127.         ReleaseObjects();
  128.         PostQuitMessage(0);
  129.         break;
  130.     }
  131.     return DefWindowProc(hWnd, message, wParam, lParam);
  132. }
  133.  
  134. // オブジェクトの開放
  135. void ReleaseObjects()
  136. {
  137.     RELEASE(lpD3DRMCube);
  138.     RELEASE(lpD3DRMLight);
  139.     RELEASE(lpD3DRMView);
  140.     RELEASE(lpD3DRMCamera);
  141.     RELEASE(lpD3DRMScene);
  142.     RELEASE(lpD3DRMDev);
  143.     RELEASE(lpD3DRM);
  144.     RELEASE(lpD3DDev);
  145.     RELEASE(lpDDZ);
  146.     RELEASE(lpD3D);
  147.     RELEASE(lpDDBack);
  148.     RELEASE(lpDDPrimary);
  149.     RELEASE(lpDD);
  150. }
  151.  
  152. // DirectDrawドライバの列挙と選定
  153. BOOL FAR PASCAL DDEnumCallback(GUID FAR *lpGUID, LPSTR lpDriverDesc,
  154.     LPSTR lpDriverName, LPVOID lpContext)
  155. {
  156.     LPDIRECTDRAW lpDD;
  157.     DDCAPS DriverCaps, HELCaps;
  158.  
  159.     if(lpGUID){
  160.         // DirectDrawオブジェクトを試しに作成
  161.         if(DirectDrawCreate(lpGUID, &lpDD, NULL)!=DD_OK) return DDENUMRET_OK;
  162.  
  163.         memset(&DriverCaps,0,sizeof(DDCAPS));
  164.         DriverCaps.dwSize=sizeof(DDCAPS);
  165.         memset(&HELCaps, 0, sizeof(DDCAPS));
  166.         HELCaps.dwSize=sizeof(DDCAPS);
  167.  
  168.         // 能力を取得
  169.         if(lpDD->GetCaps(&DriverCaps, &HELCaps)!=DD_OK){
  170.             lpDD->Release();
  171.             return DDENUMRET_OK;
  172.         }
  173.         
  174.         // 3Dアクセラレーションが利用できる場合で,
  175.         // さらにテクスチャが使える場合は,それを採用
  176.         if((DriverCaps.dwCaps&DDCAPS_3D) 
  177.                 &&(DriverCaps.ddsCaps.dwCaps&DDSCAPS_TEXTURE)){
  178.                 *(LPDIRECTDRAW*)lpContext = lpDD;
  179.                 return DDENUMRET_CANCEL;
  180.         }
  181.         lpDD->Release();
  182.     }
  183.     // 他のドライバを試す
  184.     return DDENUMRET_OK;
  185. }
  186.  
  187. // DirectDrawの初期化
  188. BOOL InitDDraw(HWND hWnd)
  189. {
  190.     // DirectDrawドライバを列挙
  191.     if(DirectDrawEnumerate(DDEnumCallback,&lpDD)!=DD_OK) return FALSE;
  192.  
  193.     // HALが利用できない場合,現在のアクティブなドライバを使う
  194.     if(!lpDD)
  195.         if(DirectDrawCreate(NULL, &lpDD, NULL)!=DD_OK) return FALSE;
  196.  
  197.     // 協調レベルの設定
  198.     lpDD->SetCooperativeLevel(hWnd,DDSCL_EXCLUSIVE|DDSCL_FULLSCREEN);
  199.  
  200.     // 画面モードの設定
  201.     lpDD->SetDisplayMode(640, 480, 16);
  202.     
  203.     // サーフェイスの作成
  204.     DDSURFACEDESC ddsd;
  205.     DDSCAPS ddscaps;
  206.  
  207.     ZeroMemory(&ddsd, sizeof(ddsd));
  208.     ZeroMemory(&ddscaps, sizeof(ddscaps));
  209.  
  210.     ddsd.dwSize=sizeof(ddsd);
  211.     ddsd.dwFlags=DDSD_CAPS|DDSD_BACKBUFFERCOUNT;
  212.     ddsd.ddsCaps.dwCaps=DDSCAPS_PRIMARYSURFACE|DDSCAPS_3DDEVICE|
  213.         DDSCAPS_FLIP|DDSCAPS_COMPLEX;
  214.     ddsd.dwBackBufferCount=1;
  215.  
  216.     lpDD->CreateSurface(&ddsd,&lpDDPrimary,NULL);
  217.  
  218.     ddscaps.dwCaps=DDSCAPS_BACKBUFFER;
  219.     lpDDPrimary->GetAttachedSurface(&ddscaps,&lpDDBack);
  220.  
  221.     DDBLTFX ddbltfx;
  222.     ZeroMemory(&ddbltfx, sizeof(DDBLTFX));
  223.     ddbltfx.dwSize=sizeof(DDBLTFX);
  224.     lpDDPrimary->Blt(NULL, NULL, NULL, DDBLT_COLORFILL|DDBLT_WAIT, &ddbltfx);
  225.     lpDDBack->Blt(NULL, NULL, NULL, DDBLT_COLORFILL|DDBLT_WAIT, &ddbltfx);
  226.  
  227.     return TRUE;
  228. }
  229.  
  230. // DirectDraw初期化エラー処理
  231. BOOL InitDDError(HWND hWnd)
  232. {
  233.     ReleaseObjects();
  234.     MessageBox(hWnd, "Initialize Error", "DirectDraw Initialize", MB_OK|MB_ICONHAND);
  235.     DestroyWindow(hWnd);
  236.     return FALSE;
  237. }
  238.  
  239. // Direct3Dデバイスを列挙する
  240. HRESULT FAR PASCAL D3DEnumCallback(LPGUID lpGuid, LPSTR lpDeviceDescription,
  241.     LPSTR lpDeviceName, LPD3DDEVICEDESC lpHWDesc, LPD3DDEVICEDESC lpHELDesc,
  242.     LPVOID lpContext)
  243. {
  244.     LPGUID *lpguid=(LPGUID*)lpContext;
  245.  
  246.     // ハードウェアデバイスか?
  247.     if(lpHWDesc->dcmColorModel){
  248.         // ハードウェアならGUIDを保存して採用
  249.         *lpguid=lpGuid;
  250.         return D3DENUMRET_CANCEL;
  251.     }
  252.     return D3DENUMRET_OK;
  253. }
  254.  
  255. // Direct3Dの初期化
  256. BOOL InitD3D( HWND hWnd )
  257. {
  258.     BOOL bHal;
  259.     LPGUID lpguid=NULL;
  260.     DDSURFACEDESC ddsd;
  261.  
  262.     // Direct3Dオブジェクトの取得
  263.     if(lpDD->QueryInterface(IID_IDirect3D2, (void**)&lpD3D )!=DD_OK) return InitD3DError(hWnd);
  264.  
  265.     // デバイスのGUIDの取得
  266.     lpD3D->EnumDevices(D3DEnumCallback, &lpguid);
  267.  
  268.     bHal=lpguid!=NULL;
  269.  
  270.     // Zバッファの作成
  271.     memset(&ddsd, 0, sizeof(DDSURFACEDESC));
  272.     ddsd.dwSize=sizeof(DDSURFACEDESC);
  273.     ddsd.dwFlags=DDSD_WIDTH|DDSD_HEIGHT|DDSD_CAPS|DDSD_ZBUFFERBITDEPTH;
  274.     ddsd.dwWidth=640;
  275.     ddsd.dwHeight=480;
  276.     ddsd.dwZBufferBitDepth=16;
  277.     ddsd.ddsCaps.dwCaps=DDSCAPS_ZBUFFER;
  278.     ddsd.ddsCaps.dwCaps|=(bHal?DDSCAPS_VIDEOMEMORY:DDSCAPS_SYSTEMMEMORY);
  279.     lpDD->CreateSurface(&ddsd, &lpDDZ, NULL);
  280.  
  281.     // Zバッファをバックバッファにアタッチ
  282.     lpDDBack->AddAttachedSurface(lpDDZ);
  283.  
  284.     if(bHal){
  285.         // ハードウェアデバイスの作成
  286.         if(lpD3D->CreateDevice(*lpguid, lpDDBack, &lpD3DDev)!=D3D_OK)
  287.             return InitD3DError(hWnd);
  288.     } else {
  289.         // もしもHALではなかったらをMMXデバイスの作成
  290.         if(lpD3D->CreateDevice(IID_IDirect3DMMXDevice, lpDDBack, &lpD3DDev)!=D3D_OK)
  291.             return InitD3DError(hWnd);
  292.     }
  293.  
  294.     // Direct3D RMオブジェクトの生成
  295.     IDirect3DRM *lpOldD3DRM;
  296.     if(Direct3DRMCreate(&lpOldD3DRM)!=D3D_OK) return InitD3DError(hWnd);
  297.     HRESULT result=lpOldD3DRM->QueryInterface(IID_IDirect3DRM3, (void **)&lpD3DRM);
  298.     RELEASE(lpOldD3DRM);
  299.     if(result!=D3D_OK) return InitD3DError(hWnd);
  300.  
  301.     // Direct3D RMデバイスの作成
  302.     if(lpD3DRM->CreateDeviceFromD3D(lpD3D, lpD3DDev, &lpD3DRMDev)!=D3D_OK)
  303.         return InitD3DError(hWnd);
  304.  
  305.     // シーンフレームの作成
  306.     lpD3DRM->CreateFrame(NULL, &lpD3DRMScene);
  307.     lpD3DRMScene->SetPosition(NULL, D3DVAL(0.0), D3DVAL(0.0), D3DVAL(0.0));
  308.  
  309.     // カメラフレームの作成
  310.     lpD3DRM->CreateFrame(lpD3DRMScene, &lpD3DRMCamera);
  311.     lpD3DRMCamera->SetPosition(lpD3DRMScene, D3DVAL(0.0), D3DVAL(0.0), D3DVAL(-10.0));
  312.  
  313.     // ビューポートの作成
  314.     if(lpD3DRM->CreateViewport(lpD3DRMDev, lpD3DRMCamera, 0, 0,
  315.         lpD3DRMDev->GetWidth(), lpD3DRMDev->GetHeight(), &lpD3DRMView)!=DD_OK)
  316.         return InitD3DError( hWnd );
  317.  
  318.     // バッククリップの設定
  319.     if(lpD3DRMView->SetBack(D3DVAL(500.0))!=DD_OK ) return InitD3DError(hWnd);
  320.  
  321.     return TRUE;
  322. }
  323.  
  324. // Direct3D初期化エラー処理
  325. BOOL InitD3DError(HWND hWnd)
  326. {
  327.     ReleaseObjects();
  328.     MessageBox(hWnd, "Initialize Error", "Direct3D Initialize", MB_OK|MB_ICONHAND);
  329.     DestroyWindow(hWnd);
  330.     return FALSE;
  331. }
  332.  
  333. // サーフェスの修復
  334. BOOL ResumeSurfaces()
  335. {
  336.     lpDDPrimary->Restore();
  337.     lpDDZ->Restore();
  338.     return TRUE;
  339. }
  340.  
  341. // 頂点のリスト
  342. D3DVECTOR vertices[]={
  343.     D3DVAL(-0.5), D3DVAL(-0.5), D3DVAL(-0.5),
  344.     D3DVAL(-0.5), D3DVAL(-0.5), D3DVAL(0.5),
  345.     D3DVAL(-0.5), D3DVAL(0.5), D3DVAL(-0.5),
  346.     D3DVAL(-0.5), D3DVAL(0.5), D3DVAL(0.5),
  347.     D3DVAL(0.5), D3DVAL(-0.5), D3DVAL(-0.5),
  348.     D3DVAL(0.5), D3DVAL(-0.5), D3DVAL(0.5),
  349.     D3DVAL(0.5), D3DVAL(0.5), D3DVAL(-0.5),
  350.     D3DVAL(0.5), D3DVAL(0.5), D3DVAL(0.5)
  351. };
  352.  
  353. // 法線ベクトルのリスト
  354. D3DVECTOR normals[]={
  355.     D3DVAL(0.0), D3DVAL(0.0), D3DVAL(1.0),
  356.     D3DVAL(0.0), D3DVAL(0.0), D3DVAL(1.0),
  357.     D3DVAL(0.0), D3DVAL(0.0), D3DVAL(1.0),
  358.     D3DVAL(0.0), D3DVAL(0.0), D3DVAL(1.0),
  359.     D3DVAL(0.0), D3DVAL(1.0), D3DVAL(0.0),
  360.     D3DVAL(0.0), D3DVAL(1.0), D3DVAL(0.0),
  361.     D3DVAL(0.0), D3DVAL(1.0), D3DVAL(0.0),
  362.     D3DVAL(0.0), D3DVAL(1.0), D3DVAL(0.0),
  363.     D3DVAL(1.0), D3DVAL(0.0), D3DVAL(0.0),
  364.     D3DVAL(1.0), D3DVAL(0.0), D3DVAL(0.0),
  365.     D3DVAL(1.0), D3DVAL(0.0), D3DVAL(0.0),
  366.     D3DVAL(1.0), D3DVAL(0.0), D3DVAL(0.0),
  367.     D3DVAL(0.0), D3DVAL(0.0), D3DVAL(-1.0),
  368.     D3DVAL(0.0), D3DVAL(0.0), D3DVAL(-1.0),
  369.     D3DVAL(0.0), D3DVAL(0.0), D3DVAL(-1.0),
  370.     D3DVAL(0.0), D3DVAL(0.0), D3DVAL(-1.0),
  371.     D3DVAL(0.0), D3DVAL(-1.0), D3DVAL(0.0),
  372.     D3DVAL(0.0), D3DVAL(-1.0), D3DVAL(0.0),
  373.     D3DVAL(0.0), D3DVAL(-1.0), D3DVAL(0.0),
  374.     D3DVAL(0.0), D3DVAL(-1.0), D3DVAL(0.0),
  375.     D3DVAL(-1.0), D3DVAL(0.0), D3DVAL(0.0),
  376.     D3DVAL(-1.0), D3DVAL(0.0), D3DVAL(0.0),
  377.     D3DVAL(-1.0), D3DVAL(0.0), D3DVAL(0.0),
  378.     D3DVAL(-1.0), D3DVAL(0.0), D3DVAL(0.0)
  379. };
  380.  
  381. // フェースリスト
  382. DWORD face[]={
  383.     4, 1, 0, 5, 1, 7, 2, 3, 3,
  384.     4, 2, 4, 3, 5, 7, 6, 6, 7,
  385.     4, 5, 8, 4, 9, 6, 10, 7, 11,
  386.     4, 0, 12, 2, 13, 6, 14, 4, 15,
  387.     4, 0, 16, 4, 17, 5, 18, 1, 19,
  388.     4, 0, 20, 1, 21, 3, 22, 2, 23,
  389. 0};
  390.  
  391. BOOL BuildScene(IDirect3DRM3 *lpD3DRM, IDirect3DRMDevice3 *lpD3DRMDev,
  392.     IDirect3DRMViewport2 *lpD3DRMView, IDirect3DRMFrame3 *lpD3DRMScene,
  393.     IDirect3DRMFrame3 *lpD3DRMCamera)
  394. {
  395.  
  396.     // クオリティの設定
  397.     lpD3DRMDev->SetShades(32);
  398.     lpD3DRM->SetDefaultTextureColors(256);
  399.     lpD3DRM->SetDefaultTextureShades(32);
  400.     lpD3DRMDev->SetDither(TRUE);
  401.     lpD3DRMDev->SetTextureQuality(D3DRMTEXTURE_LINEAR);
  402.  
  403.     // 光源のフレーム作成
  404.     lpD3DRM->CreateFrame(lpD3DRMScene, &lpD3DRMLight);
  405.     lpD3DRMLight->SetPosition(lpD3DRMScene, D3DVAL(1.0), D3DVAL(1.0),D3DVAL(-3.0));
  406.     
  407.     // 光源の作成
  408.     LPDIRECT3DRMLIGHT pLight;
  409.     
  410.     // 点ライト
  411.     lpD3DRM->CreateLightRGB(D3DRMLIGHT_POINT, D3DVAL(0.8), D3DVAL(0.8),
  412.         D3DVAL(0.8), &pLight);
  413.     lpD3DRMLight->AddLight(pLight);
  414.     RELEASE(pLight);
  415.  
  416.     // 環境ライト
  417.     lpD3DRM->CreateLightRGB(D3DRMLIGHT_AMBIENT, D3DVAL(0.2),
  418.         D3DVAL(0.2), D3DVAL(0.2), &pLight);
  419.     lpD3DRMLight->AddLight(pLight);
  420.     RELEASE(pLight);
  421.  
  422.     // キューブの作成
  423.     lpD3DRM->CreateFrame(lpD3DRMScene, &lpD3DRMCube);
  424.     lpD3DRMCube->SetPosition(lpD3DRMScene, D3DVAL(0.0), D3DVAL(0.0),
  425.         D3DVAL(0.0));
  426.     lpD3DRMCube->SetOrientation(lpD3DRMScene, D3DVAL(0.0), D3DVAL(-0.1), D3DVAL(0.3),
  427.         D3DVAL(0), D3DVAL(0.3), D3DVAL(0.1));
  428.     LPDIRECT3DRMMESHBUILDER3 builder;
  429.     LPDIRECT3DRMTEXTURE3 texture;
  430.     
  431.     // テクスチャの読み込み
  432.     lpD3DRM->LoadTexture("TEXTURE.BMP", &texture);
  433.     
  434.     // メッシュの作成
  435.     lpD3DRM->CreateMeshBuilder(&builder);
  436.     builder->AddFaces(8, vertices, 6*4, normals, face, NULL);
  437.     builder->SetColor(D3DRGBA(1.0,1.0,1.0,0.8));
  438.     builder->SetQuality(D3DRMRENDER_GOURAUD);
  439.     builder->Scale(D3DVAL(2.0), D3DVAL(2.0), D3DVAL(2.0));
  440.     
  441.     // テクスチャ座標の設定
  442.     builder->SetTextureCoordinates(0, D3DVAL(0), D3DVAL(1));
  443.     builder->SetTextureCoordinates(1, D3DVAL(1), D3DVAL(1));
  444.     builder->SetTextureCoordinates(2, D3DVAL(0), D3DVAL(0));
  445.     builder->SetTextureCoordinates(3, D3DVAL(1), D3DVAL(0));
  446.     builder->SetTextureCoordinates(4, D3DVAL(1), D3DVAL(1));
  447.     builder->SetTextureCoordinates(5, D3DVAL(0), D3DVAL(1));
  448.     builder->SetTextureCoordinates(6, D3DVAL(1), D3DVAL(0));
  449.     builder->SetTextureCoordinates(7, D3DVAL(0), D3DVAL(0));
  450.     builder->SetTexture(texture);
  451.     builder->SetPerspective(TRUE);
  452.  
  453.     lpD3DRMCube->AddVisual(builder);
  454.     
  455.     RELEASE(texture);
  456.     RELEASE(builder);
  457.  
  458.     return TRUE;
  459. }
  460.  
  461. void Render()
  462. {
  463.     // ビューのクリア
  464.     lpD3DRMView->Clear(D3DRMCLEAR_ALL);
  465.     // レンダリング
  466.     lpD3DRMView->Render(lpD3DRMScene);
  467.     // レンダリングした結果をバックバッファへコピー
  468.     lpD3DRMDev->Update();
  469.     // フリッピング
  470.     lpDDPrimary->Flip(NULL, DDFLIP_WAIT);
  471. }
  472.